<?php

namespace App\Http\Controllers;

use App\Models\Backend\System\Group;
use App\Models\Backend\System\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;

/**
 * 提供 uac 服务的控制器。
 */
class OpenApiController extends Controller
{
    public function __construct()
    {
        parent::__construct();
        $this->middleware('request.logger');
        // 关闭调试栏输出
        if (class_exists('\Debugbar')) {
            \Debugbar::disable();
        }
    }

    /**
     * 提供给UAC访问的 接口服务。
     */
    public function index(Request $request){
        try
        {
            $action = $request->action;
            $data = $request->data;
            $data = json_decode($data, TRUE );
            switch ($action)
            {
                case "user_addUser":
                case "user_updateUserCommon":
                    $this->saveUser($data);
                    break;
                case "user_deleteUser":
                    $this->deleteUser($data);
                    break;
                case "user_syncUser":
                    $this->syncUser($data);
                    break;
                case "group_addGroup":
                case "group_updateGroup":
                    $this->saveGroup($data);
                    break;
                case "group_deleteGroup":
                    $this->deleteGroup($data);
                    break;
                case "group_syncGroup":
                    $this->syncGroup($data);
                    break;
            }

            return [
                "error_code" => 0
            ];
        }
        catch(\Exception $e)
        {
            return [
                'error_code' => 1,
                'error_message'  => $e->getMessage(),
            ];
        }
    }

    /**
     * boolean user.addUser(struct $user_infos)
     * boolean user.updateUserCommon(struct $user_infos)
     *
     * 此函数用于基础平台增加用户或修改用户信息时被其调用，同步下级平台的用户数据。
     * 参数 $user_infos 为关联数组（struct）：
     *  - [user_uuid]：string, 用户的唯一标识
     *  - [user_id]：string, 用户登陆用帐号
     *  - [group_id]：int, 所属组的 ID
     *  - [user_name]：string, 真实姓名
     *  - [password]：string, 密码（本平台不保存）
     *  - [nickname]：string, 昵称
     *  - [birthday]：string, 生日
     *  - [gender]：string, 性别
     *  - [email]：string, 邮件地址
     *  - [admin_flag]：int, 帐号标志（-1 -> 公告帐号，0 -> 一般成员，1 -> 所属组组长）
     *  - [create_date]：string, 用户帐号创建时间
     *  - [user_type]：string, 用户身份代码：有 5 位，从左往右，每一位代表一种身份，
     *                    分别表示“' . implode('”、“', $base->user_types) . '”，
     *                    对应位值为 1 时表示用户具有该身份
     *
     * 执行正确则返回 true，否则返回 false。
     */
    public function saveUser($data)
    {
        try
        {
            User::saveUserFromCenter($data);
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }

    /**
     * 用户帐号信息全量同步
     */
    public function syncUser($data)
    {
        try
        {
            foreach ($data as $user){
                User::saveUserFromCenter($user);
            }
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }

    /**
     * boolean user.deleteUser(string $user_id_str)
     *
     * 此函数用于基础平台删除用户时被其调用，同步下级平台的用户数据（删除下级平台的用户记录）。
     * 参数 $user_id_str 是由用户名组成的字符串（string），每个用户名使用单引号“\'”包含，
     * 然后使用逗号“,”分割，如：$user_id_str = "\'tom\',\'jason\',\'foo\'"。<br />
     *
     * 执行正确则返回 true，否则返回 false。
     */
    public function deleteUser($data)
    {
        $data = str_replace("'", '', $data);
        try
        {
            $user_uuids = explode(',', $data);
            foreach ($user_uuids as $user_uuid) {
                $user = User::where('user_uuid', $user_uuid);
                if ($user) {
                    $user->delete();
                }
            }
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }

    /**
     * boolean user.updateUserGroup(string $user_id_str, int $group_id)
     *
     * 此函数用于基础平台给用户分组时被其调用，同步下级平台的用户分组数据。
     * 参数 $user_id_str 是由用户名组成的字符串（string），每个用户名使用单引号“\'”包含，
     * 然后使用逗号“,”分割，如：$user_id_str = "\'tom\',\'jason\',\'foo\'"。
     *
     * 执行正确则返回 true，否则返回 false。
     */
    public function updateUserGroup($m)
    {
        $user_id_str = trim(php_xmlrpc_decode($m->getParam(0)));
        $group_id = php_xmlrpc_decode($m->getParam(1));
        try
        {
            if ($user_id_str && $group_id) {
                $user_ids = explode(',', str_replace("'", "", $user_id_str));
                foreach ($user_ids as $user_id) {
                    $data = [
                        'user_id'  => $user_id,
                        'group_id' => $group_id,
                    ];
                    User::saveUserFromCenter($data);
                }
            }
        }
        catch(\Exception $e)
        {
            Log::error($e);
        }

        return new xmlrpcresp(new xmlrpcval(true, 'boolean'));
    }

    /**
     * boolean group.addGroup(struct $group_infos)
     * boolean group.updateGroup(struct $group_infos)
     *
     * 此函数用于基础平台增加或修改组时被其调用，同步下级平台的组数据。
     * 参数 $group_infos 为关联数组（struct）：
     *  - [group_id]：int, 组 ID 号
     *  - [group_name]：string, 组名称
     *  - [parent_id]：int, 上层组节点的组 ID 号
     *  - [thread_id]：int, 组树的线索 ID 号，同属于一个线索 ID 号的组在同一树中
     *  - [group_flag]：int, 组标记，0：普通组，1：学校，2：年级，3：班级
     *
     * 执行正确则返回 true，否则返回 false。
     */
    public function saveGroup($data)
    {
        try
        {
            Group::saveGroupFromCenter($data);
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }

    public function syncGroup($data)
    {
        try
        {
            foreach ($data as $group){
                Group::saveGroupFromCenter($group);
            }
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }

    /**
     * boolean group.deleteGroup($group_id)
     *
     * 此函数用于基础平台删除组时被其调用，同步删除下级平台的组数据。
     * 只有一个参数：
     *  - group_id：int, 组 ID
     *
     * 执行正确则返回 true，否则返回 false。
     */
    public function deleteGroup($data)
    {
        $group_id = intval($data['group_id']);
        try
        {
            $group = Group::find($group_id);
            if ($group) {
                $group->delete();
            }
        }
        catch(\Exception $e)
        {
            Log::error($e);
            throw $e;
        }
    }
}
